﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

using CortexMod;
using SyntaxTaggerMod;
using ClasificacionVerbo;

namespace analysisText
{
    public partial class MainPrincipal : Form
    {
        private String pathFile;
        private String datosArchivo;

        private readPDF filePdf;
        private readWordFile fileWord;

        private String resumenCortex;

        private DiccionarioVerbo DiccionarioVerbal;

        public MainPrincipal()
        {
            datosArchivo = null;
            pathFile = null;
            InitializeComponent();
        }

        private void BuscarArchivo_Click(object sender, EventArgs e)
        {
            OpenFileDialog unArchivo = new OpenFileDialog();
            if (rBtnPdf.Checked == true)
                unArchivo.Filter = "Archivo pdf | *.pdf";
            //if (rBtnTexto.Checked == true)
            //    unArchivo.Filter = "Archivos txt o word | *.txt;*.docx;*.py;*.FL0";
            //unArchivo.Filter = "Archivos txt | *.txt | *.fl0 | *.py";
            unArchivo.FileName = "Seleccione el archivo a leer";
            unArchivo.Title = "Seleccion un archivo con extension .txt o .pdf";

            DialogResult result = unArchivo.ShowDialog();
            if (result.ToString().Equals("OK") == true)
            {
                btnLimpiar.Enabled = true;
                btnLimpiar.Enabled = true;
                pathFile = unArchivo.FileName.ToString();
            }
        }

        private String readFile()
        {
            try
            {
                System.IO.StreamReader sr = new System.IO.StreamReader(pathFile, System.Text.Encoding.Default, true);
                string texto;
                texto = sr.ReadToEnd();
                return texto;
            }
            catch
            {
                MessageBox.Show("Ingrese un archivo en Inicio");
                return "";
            }
        }

        private String readTextOfPdf()
        {
            filePdf = new readPDF(pathFile);
            filePdf.readTextPDF();
            return filePdf.getTextPdf();
        }

        private String readTextOfWord()
        {
            fileWord = new readWordFile(pathFile);
            fileWord.readTextWord();
            return fileWord.getTextWord();
        }

        

        private void btnLeer_Click(object sender, EventArgs e)
        {
            if (rBtnTexto.Checked == true)
            {
                lblUploadedFile.Text = pathFile;
                datosArchivo = readFile();
                txtBoxArchivo.Text = datosArchivo;
                //MessageBox.Show("Lectura por texto plano");
            }
            if (rBtnPdf.Checked == true)
            {
                lblUploadedFile.Text = pathFile;
                datosArchivo = readTextOfPdf();
                txtBoxArchivo.Text = datosArchivo;
                //MessageBox.Show("lectura por pdf");
            }

            if (rBtnWord.Checked == true)
            {
                lblUploadedFile.Text = pathFile;
                datosArchivo = readTextOfWord();
                txtBoxArchivo.Text = datosArchivo;
                //MessageBox.Show("lectura por Word");
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            txtBoxArchivo.ResetText();
            lblUploadedFile.ResetText();
            btnLimpiar.Enabled = false;
            btnLimpiar.Enabled = false;
            rBtnTexto.Checked = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            String porcentajeResumen = this.comboBoxPorcentajeResumen.SelectedItem.ToString();

            Cortex cortex = new Cortex(datosArchivo);

           

            String[] frasesOriginal = cortex.getArregloFrasesOriginal();
            String[] frasesCortex = cortex.getArregloFrasesCortex();
           // Console.WriteLine(" aqui estoy");

          

            int[] indice = cortex.getIndiceFrasesOriginal();

            float votoEntropia = cortex.getVotoEntropia();
            float votoFrecuencia = cortex.getVotoFrecuencia();


            string[] frases = getPorcentajeFrases(porcentajeResumen, frasesOriginal, indice);

            this.mostrarDatosCortex(votoEntropia, votoFrecuencia, frasesOriginal, frasesCortex/*, frecuencia,entropia,frecuencia*/);
            resumenCortex = this.getFrasesComoParrafos(frases);
        }


        public void mostrarDatosCortex(float entropia, float frecuencia, string[] originalesFrases, string[] frecRar)
        {
            this.texBoxFrecuencia.Text = ""+frecuencia;
            this.textBox2.Text = ""+entropia;

            for (int i = 0; i < originalesFrases.Length; i++)
            {
                this.dataGridView1.Rows.Add(originalesFrases[i], frecRar[i]);

            }
        }

        public string getFrasesComoParrafos(string [] frases)
        {
            string datosArch = datosArchivo.Replace("\r\n", "@");
            datosArch = datosArch.Replace("@@", "#");
            datosArch = datosArch.Replace("@", " ");


            string resumen = "";

            string [] parrafos = datosArch.Split('#');

            //int indice = 0;
            foreach(string parrafo in parrafos)
            {
                int indice = 0;
            
                foreach(string frase in frases)
                {
                    if (parrafo.Contains(frase))
                    {
                        resumen += frase+". ";
                    }

                    if (indice == frases.Length-1)
                    {
                        resumen += "\n";
                    }
                    indice++;
                }
                resumen = resumen.Replace("\n\n", "\n");
                
            }

            this.textBoxResumen.Text = resumen;
            this.tabControlPrincipal.SelectTab("tabPageAnalisis");

            return resumen;
        }

        public string [] getPorcentajeFrases(string porcentaje, string[] var, int[] indice)
        {
            int cantidadFrases = 0;

            if (porcentaje.Equals("25%"))
            {
                cantidadFrases = (int)(indice.Length / 4);
                //MessageBox.Show("25% cantidad de frases "+cantidadFrases);
            }
            if (porcentaje.Equals("35%"))
            {
                cantidadFrases = (int)(indice.Length * 0.35);
                //MessageBox.Show("30% cantidad de frases "+cantidadFrases);
            }
            if (porcentaje.Equals("50%"))
            {
                cantidadFrases = (int)(indice.Length / 2);
                //MessageBox.Show("50%  cantidad de frases "+cantidadFrases);
            }
            if (porcentaje.Equals("70%"))
            {
                cantidadFrases = (int)(indice.Length * 0.7);
                //MessageBox.Show("70% cantidad de frases "+cantidadFrases);
            }


            //ordenamiento
            int auxili;
            String frase = "";
            int j;
            for (int i = 0; i < cantidadFrases; i++)
            {
                auxili = indice[i];
                frase = var[i];
                j = i - 1;
                while (j >= 0 && indice[j] > auxili)
                {
                    indice[j + 1] = indice[j];
                    var[j + 1] = var[j];
                    j--;
                }
                indice[j + 1] = auxili;
                var[j + 1] = frase;
            }


            string[] frases = new string[cantidadFrases];

            for (int i = 0; i < cantidadFrases; i++)
            {
                frases[i]=var[i];
            }


            return frases;
        }


        public void Convertir(string str)
        {
            Encoding ascii = Encoding.ASCII;
            Byte[] arrayBytes = ascii.GetBytes(str);
            string cadena = "";
            foreach (Char c in arrayBytes)
            {
                MessageBox.Show(""+int.Parse(""+c));
                cadena +=  c.ToString();
            }

        }




        private void btnPDF_Click(object sender, EventArgs e)
        {
            Document document = new Document();

            String nombreArchivo = Microsoft.VisualBasic.Interaction.InputBox("Ingrese nombre pdf resumen","Nombre PDF");

            
            if (nombreArchivo.Length==0)
            {
                nombreArchivo = "Resumen_"+DateTime.Now.ToString("HH_mm_ss_tt")+".pdf";  
            }
            /*else
            {
                if (nombreArchivo.Length > 4 && !nombreArchivo.Substring(nombreArchivo.Length - 4, nombreArchivo.Length).Equals(".pdf"))
                {
                    nombreArchivo = nombreArchivo + ".pdf";
                }
                else
                {
                    nombreArchivo = nombreArchivo + ".pdf";
                }
            
            }*/

            PdfWriter.GetInstance(document,new FileStream(nombreArchivo,FileMode.OpenOrCreate));


            document.Open();

            document.Add(new Paragraph(this.textBoxResumen.Text));

            document.Close();
        }

        private void MainPrincipal_Load(object sender, EventArgs e)
        {

        }

        private void btnAnalisisLinguistico_Click(object sender, EventArgs e)
        {
            // Split Texto en oraciones.
            String resumentoSplit = resumenCortex.Replace(". ", "#");
            String[] parrafos = resumentoSplit.Split('#');
            
            // Analizar Frases
            SyntaxTagger elTagger = new SyntaxTagger();

            for (int i = 0; i < parrafos.Length; i++)
            {
                string parrafoToSplit = parrafos[i].Replace(". ", "#");

                string[] oraciones = parrafoToSplit.Split('#');


 
                /*fraseToSplit = fraseToSplit.Replace(",", "#");
                fraseToSplit = fraseToSplit.Replace(",", "#");
                fraseToSplit = fraseToSplit.Replace(" o ", "#");

                string[] frases = fraseToSplit.Split('#');*/

                for (int z = 0; z < oraciones.Length; z++)
                {
                    oraciones[z] += "."; 

                    elTagger.tagPhrase(oraciones[z]);
                    /*
                    Console.Out.WriteLine(oraciones[z]);
                    Console.Out.WriteLine("Verbo: " + elTagger.returnAction() + ", Base: " + elTagger.returnBaseform(elTagger.returnAction()) + ", Tiempo: " + elTagger.returnTime(elTagger.returnAction()));
                    int actionPosition = elTagger.returnActionPosition(elTagger.returnAction());
                    Console.Out.WriteLine("Sujeto: " + elTagger.returnSubject(actionPosition) + ", Base: " + elTagger.returnBaseform(elTagger.returnSubject(actionPosition)) + ", Genero: " + elTagger.returnGenero(elTagger.returnSubject(actionPosition)) + ", Card: " + elTagger.returnCardinalidad(elTagger.returnSubject(actionPosition)));
                    Console.Out.WriteLine("Objeto: " + elTagger.returnObject(actionPosition) + ", Base: " + elTagger.returnBaseform(elTagger.returnObject(actionPosition)) + ", Genero: " + elTagger.returnGenero(elTagger.returnObject(actionPosition)) + ", Card: " + elTagger.returnCardinalidad(elTagger.returnObject(actionPosition)));
                    */

                    String elVerbo = elTagger.returnAction();
                    int actionPosition = elTagger.returnActionPosition(elTagger.returnAction());
                    String elSujeto = elTagger.returnSubject(actionPosition);
                    String elObjeto = elTagger.returnObject(actionPosition);

                    String elVerboTiempo = elTagger.returnTime(elVerbo);

                    String elSujetoGenero = elTagger.returnGenero(elSujeto);
                    String elSujetoCardinalidad = elTagger.returnCardinalidad(elSujeto);

                    String elObjetoGenero = elTagger.returnGenero(elObjeto);
                    String elObjetoCardinalidad = elTagger.returnCardinalidad(elObjeto);

                    elVerbo = elVerbo.Trim();

                    if (!elVerbo.Equals(string.Empty))
                    {
                        elVerbo = elTagger.returnBaseform(elVerbo);
                        elVerbo = elVerbo.Trim();
                        DiccionarioVerbal = new DiccionarioVerbo(elVerbo);

                        /*
                        Console.Out.WriteLine("Verbo: " + elVerbo);
                        Console.Out.WriteLine("Clasificacion:" + DiccionarioVerbal.getValueDictionary());
                        Console.Out.WriteLine();
                        */

                        String laClasificacion = DiccionarioVerbal.getValueDictionary();

                        if(!laClasificacion.Equals("undefined"))
                        {
                            this.dataGridView2.Rows.Add(oraciones[z], elVerbo, elVerboTiempo, elSujeto, elSujetoGenero, elSujetoCardinalidad, elObjeto, elObjetoGenero, elObjetoCardinalidad, laClasificacion, "true");
                        }else{
                            this.dataGridView2.Rows.Add(oraciones[z], elVerbo, elVerboTiempo, elSujeto, elSujetoGenero, elSujetoCardinalidad, elObjeto, elObjetoGenero, elObjetoCardinalidad, laClasificacion, "false");
                        }

                    }
                    else
                    {

                    }
                    
                }
                this.tabControlPrincipal.SelectTab("tabPageSemantico");
            }

        }

    }
}
